package com.yy.base.servlet.upload;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;

public class File extends java.io.File {
	private static final long serialVersionUID = 4375312068477798393L;
	private String contentType;
	private String fileName;
	private boolean allowed;
	private boolean missing;
	private long length;
	private URL url;
	private String relativePath;
	private InputStream inputStream;

	public File(String pathname) {
		super(pathname);
	}

	void setFileName(String fileName) {
		this.fileName = fileName;
	}

	@Override
	public String getName() {
		return fileName;
	}

	@Override
	public URL toURL() {
		return url;
	}

	@Override
	public String toString() {
		return url == null ? "" : url.toString();
	}

	@Override
	public URI toURI() {
		try {
			return url == null ? null : url.toURI();
		} catch (URISyntaxException e) {
			return null;
		}
	}

	@Override
	public long length() {
		if (length <= 0) {
			return super.length();
		} else {
			return length;
		}
	}

	/**
	 * 判断文件是否丢失。
	 * @return <li>true ： 文件已丢失，可能原因是上传过程中遇到异常或者文件为非允许上传的类型。</li> <li>false : 文件已经成功保存。</li>
	 */
	public boolean isMissing() {
		return missing;
	}

	void setMissing(boolean missing) {
		this.missing = missing;
	}

	/**
	 * 获取文件真实内容类型。
	 * @return 文件内容类型。
	 */
	public String getContentType() {
		return contentType;
	}

	void setContentType(String contentType) {
		this.contentType = contentType;
	}

	/**
	 * 判断文件是否允许上传。
	 * @return <li>true ： 允许</li> <li>false : 不允许</li>
	 */
	public boolean isAllowed() {
		return allowed;
	}

	void setAllowed(boolean allowed) {
		this.allowed = allowed;
	}

	void setUrl(URL url) {
		this.url = url;
	}

	void setLength(long length) {
		this.length = length;
	}

	/**
	 * 获取文件相对路径。
	 * @return 文件相对于Web应用根目录的路径。
	 */
	public String getRelativePath() {
		return relativePath;
	}

	void setRelativePath(String relativePath) {
		this.relativePath = relativePath;
	}

	/**
	 * 获取文件输入流。
	 * @return 文件输入流。
	 * @throws FileNotFoundException 获取文件输入流失败。
	 */
	public InputStream getInputStream() throws FileNotFoundException {
		return inputStream == null ? (isMissing() ? null : new FileInputStream(this)) : inputStream;
	}

	void setInputStream(InputStream inputStream) {
		this.inputStream = inputStream;
	}
}
